https://laihao2.com/Home/WaterList
ASP.NET開發操作流程:資料表設定好>再寫程式:加入資料庫>串聯資料庫>產生Models裡面類別檔dao>按:建置>Controllers裡面的Entities>產生畫面View
資料表設定好>再寫程式:加入資料庫>串聯資料庫>
USE [ProductDB]
GO
/****** Object:  Table [dbo].[WATER_BILL]    Script Date: 2024/9/26 下午 11:59:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[WATER_BILL](
	[DOCUMENT_ID] [nvarchar](200) NOT NULL,
	[FACTORY] [nvarchar](200) NULL,
	[WATER_SIGNAL] [nvarchar](200) NULL,
	[FROM_BILLING_PERIOD] [datetime2](7) NULL,
	[UNTIL_BILLING_PERIOD] [datetime2](7) NULL,
	[TYPE] [nvarchar](200) NULL,
	[METER_NUMBER] [nvarchar](200) NULL,
	[METER_DIAMETER] [int] NOT NULL,
	[NUMBER_POINTERS] [decimal](18, 2) NULL,
	[TOTAL_WATER] [decimal](18, 2) NULL,
	[TOTAL_BILL_TAX] [decimal](18, 2) NULL,
	[CARBON_PERIOD] [decimal](18, 2) NULL,
	[CARBON_EMISSION_FACTOR] [decimal](18, 2) NULL,
	[CARBON_DIOXIDE] [decimal](18, 2) NULL,
	[data] [datetime] NULL,
	[CreatedBy] [nvarchar](max) NULL,
	[PDF_FILE] [varbinary](max) NULL,
	[ImageMimeType] [nvarchar](max) NULL,
	[PDF_CONTENT] [varbinary](max) NULL,
	[VOUCHER_NUMBER] [nvarchar](200) NULL,
 CONSTRAINT [PK_WATER_BILL] PRIMARY KEY CLUSTERED 
(
	[DOCUMENT_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
解釋程式碼
這段 SQL 腳本用於在資料庫 ProductDB 中創建名為 WATER_BILL 的表。該表的結構定義了與水費單相關的數據欄位,並指定了各欄位的數據類型、約束以及索引。以下是詳細解釋:
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON:指定在比較 NULL 值時,NULL = NULL 會返回 FALSE,而 NULL <> NULL 也返回 FALSE。這是 SQL 標準的行為。SET QUOTED_IDENTIFIER ON:允許在 SQL 語句中使用雙引號來引用標識符(如表名和欄位名),而不是單純用雙引號表示字串。CREATE TABLE [dbo].[WATER_BILL](
      NOT NULL,
      NULL,
      NULL,
    [FROM_BILLING_PERIOD] [datetime2](7) NULL,
    [UNTIL_BILLING_PERIOD] [datetime2](7) NULL,
      NULL,
      NULL,
    [METER_DIAMETER] [int] NOT NULL,
    [NUMBER_POINTERS] [decimal](18, 2) NULL,
    [TOTAL_WATER] [decimal](18, 2) NULL,
    [TOTAL_BILL_TAX] [decimal](18, 2) NULL,
    [CARBON_PERIOD] [decimal](18, 2) NULL,
    [CARBON_EMISSION_FACTOR] [decimal](18, 2) NULL,
    [CARBON_DIOXIDE] [decimal](18, 2) NULL,
    [data] [datetime] NULL,
    [CreatedBy] [nvarchar](max) NULL,
    [PDF_FILE] [varbinary](max) NULL,
    [ImageMimeType] [nvarchar](max) NULL,
    [PDF_CONTENT] [varbinary](max) NULL,
    [VOUCHER_NUMBER] [nvarchar](200) NULL,
nvarchar(200) 類型,最大長度為 200 個字元,且不允許為空。這個欄位被設置為主鍵。nvarchar(200),允許為空。nvarchar(200),允許為空。datetime2(7),允許為空。datetime2(7) 可以精確到 7 個小數位(納秒級)。nvarchar(200),允許為空。nvarchar(200),允許為空。int 類型,不允許為空。decimal(18, 2) 類型,精度為 18 位數字,小數位數為 2。datetime 類型,允許為空。nvarchar(max),沒有長度限制,允許為空。varbinary(max),允許為空,沒有大小限制。nvarchar(max),允許為空。nvarchar(200),允許為空。CONSTRAINT [PK_WATER_BILL] PRIMARY KEY CLUSTERED (
    [DOCUMENT_ID] ASC
)
DOCUMENT_ID 為表的主鍵,並使用聚簇索引(PRIMARY KEY CLUSTERED),表示資料會按 DOCUMENT_ID 的升序(ASC)排列。WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)
PAD_INDEX = OFF:禁用填充索引頁的功能。STATISTICS_NORECOMPUTE = OFF:允許自動重新計算統計資料。IGNORE_DUP_KEY = OFF:如果插入重複鍵值,會引發錯誤。ALLOW_ROW_LOCKS = ON 和 ALLOW_PAGE_LOCKS = ON:允許行和頁的鎖定。OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF:禁用優化連續鍵插入。TEXTIMAGE_ON [PRIMARY]
varbinary(max) 和 nvarchar(max) 等大型資料類型存儲在主檔案組中。這段 SQL 創建了一個名為 WATER_BILL 的表,包含與水費單相關的欄位,定義了欄位的類型、大小和約束。主鍵設置在 DOCUMENT_ID 欄位上,並且允許存儲二進制文件(如 PDF 文件)和其他詳細的水費數據。
產生Models裡面類別檔dao>按:建置>
namespace WebApplication5.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
   
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    [Table("WATER_BILL")]
    public partial class WATER_BILL
    {
        [Display(Name = "單據號碼")]
        [Required(ErrorMessage = "必填")]
        [Key]
        [StringLength(200)]
        public string DOCUMENT_ID { get; set; }
        [Display(Name = "廠區")]
        [StringLength(200)]
        public string FACTORY { get; set; }
        [Display(Name = "水號")]
        [StringLength(200)]
        public string WATER_SIGNAL { get; set; }
        [Display(Name = "計費期間起")]
        [Column(TypeName = "datetime2")]
        public DateTime? FROM_BILLING_PERIOD { get; set; }
        public string FormattedFROM_BILLING_PERIOD
        {
            get
            {
                return FROM_BILLING_PERIOD?.ToString("yyyy-MM-dd");
            }
        }
        [Display(Name = "計費期間迄")]
        [Column(TypeName = "datetime2")]
        public DateTime? UNTIL_BILLING_PERIOD { get; set; }
        public string FormattedUNTIL_BILLING_PERIOD
        {
            get
            {
                return UNTIL_BILLING_PERIOD?.ToString("yyyy-MM-dd");
            }
        }
        [Display(Name = "用水種別")]
        [StringLength(200)]
        public string TYPE { get; set; }
        [Display(Name = "水表表號")]
        [StringLength(200)]
        public string METER_NUMBER { get; set; }
        [Display(Name = "水表口徑")]
        public int METER_DIAMETER { get; set; }
        [Display(Name = "本期指針數")]
        public decimal? NUMBER_POINTERS { get; set; }
        public string FormattedNUMBER_POINTERS
        {
            get
            {
                return NUMBER_POINTERS?.ToString("#,##0");
                //return NUMBER_POINTERS?.ToString("0");
            }
        }
        [Display(Name = "總用度數")]
        public decimal? TOTAL_WATER { get; set; }
        public string FormattedTOTAL_WATER
        {
            get
            {
                return TOTAL_WATER?.ToString("#,##0");
                //return TOTAL_WATER?.ToString("0");
            }
        }
        [Display(Name = "總水費(含稅)")]
        public decimal? TOTAL_BILL_TAX { get; set; }
        public string FormattedTOTAL_BILL_TAX
        {
            get
            {
                return TOTAL_BILL_TAX?.ToString("C0");
                //顯示成金額格式
            }
        }
        [Display(Name = "本期碳排量")]
        public decimal? CARBON_PERIOD { get; set; }
        public string FormattedCARBON_PERIOD
        {
            get
            {
                return CARBON_PERIOD?.ToString("#,##0");
                //return CARBON_PERIOD?.ToString("0");
            }
        }
        [Display(Name = "碳排係數")]
        public decimal? CARBON_EMISSION_FACTOR { get; set; }
        [Display(Name = "二氧化碳當量")]
        public decimal? CARBON_DIOXIDE { get; set; }
        [Display(Name = "建立時間")]
        public DateTime? data { get; set; }
        [Display(Name = "建立者")]
        public string CreatedBy { get; set; }
        [Display(Name = "水費電子通知單:上傳(最大2MB)")]
        [MaxLength]
        public byte[] PDF_FILE { get; set; }
        [HiddenInput(DisplayValue = false)]
        public string ImageMimeType { get; set; }
        [Display(Name = "水費電子通知單:上傳(最大2MB)")]
        public byte[] PDF_CONTENT { get; set; }
        [Display(Name = "傳票號碼")]
        [StringLength(200)]
        public string VOUCHER_NUMBER { get; set; }
    }
}
ProductDBContext程式碼參考前面幾天~
解釋程式碼
這段程式碼定義了一個名為 WATER_BILL 的實體類,它表示一個水費單的資料結構,並且使用了 ASP.NET MVC 和 Entity Framework 來與資料庫進行互動。以下是對程式碼的詳細解釋:
namespace WebApplication5.Models
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
namespace WebApplication5.Models:定義了這個類所屬的命名空間。System:提供基本的類型定義和功能,如 DateTime。System.ComponentModel.DataAnnotations:提供資料驗證和顯示屬性。System.ComponentModel.DataAnnotations.Schema:提供映射屬性(如表名和欄位類型)。System.Web.Mvc:提供 MVC 框架相關的功能,如隱藏輸入字段。[Table("WATER_BILL")]
public partial class WATER_BILL
{
    [Display(Name = "單據號碼")]
    [Required(ErrorMessage = "必填")]
    [Key]
    [StringLength(200)]
    public string DOCUMENT_ID { get; set; }
public partial class WATER_BILL:定義了一個名為 WATER_BILL 的部分類,這意味著它可以分佈在多個檔案中,便於進行模組化開發。[Table("WATER_BILL")]:這個類對應的資料庫表名為 WATER_BILL。DOCUMENT_ID:單據號碼欄位,設定了多個屬性:
[Display(Name = "單據號碼")]:顯示名稱為 "單據號碼"。[Required(ErrorMessage = "必填")]:表示此欄位是必填的,錯誤訊息為 "必填"。[Key]:設定為主鍵。[StringLength(200)]:欄位的最大長度為 200 個字元。[Display(Name = "廠區")]
[StringLength(200)]
public string FACTORY { get; set; }
[Display(Name = "水號")]
[StringLength(200)]
public string WATER_SIGNAL { get; set; }
FACTORY 和 WATER_SIGNAL 分別代表廠區和水號欄位,均設有顯示名稱和字串長度限制。[Display(Name = "計費期間起")]
[Column(TypeName = "datetime2")]
public DateTime? FROM_BILLING_PERIOD { get; set; }
public string FormattedFROM_BILLING_PERIOD
{
    get
    {
        return FROM_BILLING_PERIOD?.ToString("yyyy-MM-dd");
    }
}
FROM_BILLING_PERIOD 是計費期間的開始日期,使用 DateTime? 來允許這個欄位為空。[Column(TypeName = "datetime2")]:指定資料庫中的欄位類型為 datetime2。FormattedFROM_BILLING_PERIOD 是計費期間起的格式化屬性,用來顯示為 yyyy-MM-dd 格式的日期。相似的格式化方式也應用於 UNTIL_BILLING_PERIOD,代表計費期間的結束日期。
[Display(Name = "用水種別")]
[StringLength(200)]
public string TYPE { get; set; }
[Display(Name = "水表表號")]
[StringLength(200)]
public string METER_NUMBER { get; set; }
[Display(Name = "水表口徑")]
public int METER_DIAMETER { get; set; }
TYPE 代表用水的種類,如工業用水或生活用水。METER_NUMBER 是水表的編號,METER_DIAMETER 代表水表口徑,數據型別為 int。[Display(Name = "本期指針數")]
public decimal? NUMBER_POINTERS { get; set; }
public string FormattedNUMBER_POINTERS
{
    get
    {
        return NUMBER_POINTERS?.ToString("#,##0");
    }
}
[Display(Name = "總用度數")]
public decimal? TOTAL_WATER { get; set; }
public string FormattedTOTAL_WATER
{
    get
    {
        return TOTAL_WATER?.ToString("#,##0");
    }
}
NUMBER_POINTERS 和 TOTAL_WATER 是水表的本期指針數和總用度數,型別為 decimal?,可以為空。[Display(Name = "總水費(含稅)")]
public decimal? TOTAL_BILL_TAX { get; set; }
public string FormattedTOTAL_BILL_TAX
{
    get
    {
        return TOTAL_BILL_TAX?.ToString("C0");
    }
}
[Display(Name = "本期碳排量")]
public decimal? CARBON_PERIOD { get; set; }
public string FormattedCARBON_PERIOD
{
    get
    {
        return CARBON_PERIOD?.ToString("#,##0");
    }
}
TOTAL_BILL_TAX 代表總水費,包括稅金。FormattedTOTAL_BILL_TAX 使用了金額格式 (C0) 來顯示水費。CARBON_PERIOD 表示本期碳排量,同樣以千分位格式顯示。[Display(Name = "建立時間")]
public DateTime? data { get; set; }
[Display(Name = "水費電子通知單:上傳(最大2MB)")]
[MaxLength]
public byte[] PDF_FILE { get; set; }
[HiddenInput(DisplayValue = false)]
public string ImageMimeType { get; set; }
[Display(Name = "水費電子通知單:上傳(最大2MB)")]
public byte[] PDF_CONTENT { get; set; }
data 是水費單的建立時間。PDF_FILE 和 PDF_CONTENT 都是用來存儲上傳的水費電子通知單,型別為 byte[],用於存放二進制數據。ImageMimeType 隱藏在表單中,用於儲存文件的 MIME 類型。[Display(Name = "傳票號碼")]
[StringLength(200)]
public string VOUCHER_NUMBER { get; set; }
VOUCHER_NUMBER 是水費單的傳票號碼,長度限制為 200 字元。這個類 WATER_BILL 定義了水費單的所有欄位和一些格式化屬性。每個屬性都有其對應的資料庫欄位、顯示名稱以及必要的驗證。格式化屬性使得日期、數字、金額等資料能夠以易於閱讀的形式顯示給使用者。
ProductDBContext程式碼也是同前幾天~
Controllers裡面的Entities>
public ActionResult WaterList(string factory = "")
        {
            ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
            var customers = _db.WATER_BILL.ToList();
            DateTime startDate;
            DateTime endDate;
            if (!String.IsNullOrEmpty(Request.QueryString["startDate"]))
            {
                startDate = DateTime.Parse(Request.QueryString["startDate"]);
            }
            else
            {
                startDate = DateTime.MinValue;
            }
            if (!String.IsNullOrEmpty(Request.QueryString["endDate"]))
            {
                endDate = DateTime.Parse(Request.QueryString["endDate"]);
            }
            else
            {
                endDate = DateTime.MaxValue;
            }
            var ESGs = _db.WATER_BILL
            .OrderByDescending(x => x.FROM_BILLING_PERIOD)
            .Where(x => x.FROM_BILLING_PERIOD >= startDate &&
            x.FROM_BILLING_PERIOD <= endDate)
            .ToList();
            if (!string.IsNullOrEmpty(factory))
            {
                ESGs = ESGs.Where(x => x.FACTORY == factory).ToList();
            }
            // 20240325將 PDF 檔案內容傳遞給視圖
            foreach (var item in customers)
            {
                item.ImageMimeType = "application/pdf";
            }
            return View(ESGs);
        }
解釋程式碼
這段 C# 代碼是一個 ASP.NET MVC 控制器中的 WaterList 方法,用於處理水費賬單的查詢和篩選操作。下面是對代碼的詳細解釋:
public ActionResult WaterList(string factory = "")
ActionResult,表示它是一個控制器方法,用於生成視圖或執行其他控制器動作。factory 是一個可選參數,默認值為空字符串,用於篩選特定工廠的水費賬單。ViewBag.Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag 動態對象設置視圖的布局文件,指定了視圖的布局為共享的 _Layout.cshtml 文件。var customers = _db.WATER_BILL.ToList();
WATER_BILL(水費賬單)記錄,並將結果存儲在 customers 列表中。startDate 和 endDateDateTime startDate;
DateTime endDate;
if (!String.IsNullOrEmpty(Request.QueryString["startDate"]))
{
    startDate = DateTime.Parse(Request.QueryString["startDate"]);
}
else
{
    startDate = DateTime.MinValue;
}
if (!String.IsNullOrEmpty(Request.QueryString["endDate"]))
{
    endDate = DateTime.Parse(Request.QueryString["endDate"]);
}
else
{
    endDate = DateTime.MaxValue;
}
startDate 和 endDate 參數。startDate,則將其解析為 DateTime 類型;否則,將 startDate 設置為 DateTime.MinValue(最早日期)。endDate,則解析為日期;否則,將 endDate 設置為 DateTime.MaxValue(最晚日期)。var ESGs = _db.WATER_BILL
    .OrderByDescending(x => x.FROM_BILLING_PERIOD)
    .Where(x => x.FROM_BILLING_PERIOD >= startDate && x.FROM_BILLING_PERIOD <= endDate)
    .ToList();
WATER_BILL 表中根據賬單日期範圍(FROM_BILLING_PERIOD)查詢賬單。startDate 和 endDate 範圍內的記錄。if (!string.IsNullOrEmpty(factory))
{
    ESGs = ESGs.Where(x => x.FACTORY == factory).ToList();
}
factory 參數,則進一步篩選結果,僅返回符合指定工廠(FACTORY)的記錄。foreach (var item in customers)
{
    item.ImageMimeType = "application/pdf";
}
customers),並將其 ImageMimeType 屬性設置為 "application/pdf",表明這些賬單的內容是 PDF 文件。return View(ESGs);
ESGs 傳遞給視圖進行顯示。startDate、endDate 和 factory 參數來篩選賬單數據。最終篩選的賬單列表會傳遞到視圖中進行展示,且每個賬單被標記為 PDF 類型。產生畫面View程式碼
@model IEnumerable<WebApplication5.Models.WATER_BILL>
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@{
    ViewBag.Title = "WaterList";
}
<h2>作品-水費</h2>
<h3>依照水費內容</h3>
<style>
    .align-right {
        text-align: right;
    }
</style>
<div style="margin-top: 50px;">
    <h2>水費:列表</h2>
    <p>
        @Html.ActionLink("水費:新增", "WaterCreate", null, new { @class = "btn btn-danger" })
        @*@Html.ActionLink("水費:新增", "WaterCreate")*@
    </p>
    <form method="get" action="@Url.Action("WaterList", "Home")">
        <label for="startDate">開始日期:</label>
        <input type="date" name="startDate">
        <label for="endDate">結束日期:</label>
        <input type="date" name="endDate">
        <button type="submit">搜索</button>
    </form>
</div>
@using (Html.BeginForm())
{
    <label>廠區:</label>
    @Html.DropDownList("factory", new List<SelectListItem>
{
  @*new SelectListItem { Value = "樹谷一期", Text = "樹谷一期/水號:63-43233502-2" },*@
  new SelectListItem { Value = "永康廠", Text = "永康廠/水號:12-34567890-1" },
  new SelectListItem { Value = "永科廠", Text = "永科廠/水號:23-45678901-2" }
})
    <input type="submit" value="搜索" />
}
<table class="table" style="margin-top: 20px;">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.DOCUMENT_ID)
            </th>
            @*<th>
                    @Html.DisplayNameFor(model => model.FACTORY)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.WATER_SIGNAL)
                </th>*@
            <th>
                @Html.DisplayNameFor(model => model.FROM_BILLING_PERIOD)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.UNTIL_BILLING_PERIOD)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TYPE)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.METER_NUMBER)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.METER_DIAMETER)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.NUMBER_POINTERS)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TOTAL_WATER)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.TOTAL_BILL_TAX)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.CARBON_PERIOD)
            </th>
            <!-- **** 20240327加入輸入傳票號碼**** -->
            <th>
                @Html.DisplayNameFor(model => model.VOUCHER_NUMBER)
            </th>
            <th>
                水費電子通知單:上傳(最大2MB)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.DOCUMENT_ID)
                </td>
                <td>
                    @*@Html.DisplayFor(modelItem => item.FROM_BILLING_PERIOD)*@
                    @Html.DisplayFor(modelItem => item.FormattedFROM_BILLING_PERIOD)
                </td>
                <td>
                    @*@Html.DisplayFor(modelItem => item.UNTIL_BILLING_PERIOD)*@
                    @Html.DisplayFor(modelItem => item.FormattedUNTIL_BILLING_PERIOD)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.TYPE)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.METER_NUMBER)
                </td>
                <td class="align-right">
                    @Html.DisplayFor(modelItem => item.METER_DIAMETER)
                </td>
                <td class="align-right">
                    @*@Html.DisplayFor(modelItem => item.NUMBER_POINTERS)*@
                    @Html.DisplayFor(modelItem => item.FormattedNUMBER_POINTERS)
                </td>
                <td class="align-right">
                    @*@Html.DisplayFor(modelItem => item.TOTAL_WATER)*@
                    @Html.DisplayFor(modelItem => item.FormattedTOTAL_WATER)
                </td>
                <td class="align-right">
                    @*@Html.DisplayFor(modelItem => item.TOTAL_BILL_TAX)*@
                    @Html.DisplayFor(modelItem => item.FormattedTOTAL_BILL_TAX)
                </td>
                <td class="align-right">
                    @*@Html.DisplayFor(modelItem => item.CARBON_PERIOD)*@
                    @Html.DisplayFor(modelItem => item.FormattedCARBON_PERIOD)
                </td>
                <!-- **** 20240327加入輸入傳票號碼**** -->
                <td class="align-right">
                    @Html.DisplayFor(modelItem => item.VOUCHER_NUMBER)
                </td>
                <td>
                    @if (item.PDF_CONTENT != null && item.PDF_CONTENT.Length > 0)
                    {
                        <a href="@Url.Action("GetPdfFile", "Home", new { id = item.DOCUMENT_ID })" target="_blank">檢視 PDF 檔案</a>
                    }
                    else
                    {
                        <span>沒有上傳 PDF 檔案</span>
                    }
                </td>
                <td>
                    @Html.ActionLink("修改", "WaterEdit", new { id = item.DOCUMENT_ID })
                    @*@Html.ActionLink("Details", "Details", new { id = item.DOCUMENT_ID }) | *@
                    @*@Html.ActionLink("Delete", "Delete", new { id = item.DOCUMENT_ID }) *@
                </td>
            </tr>
        }
    </tbody>
</table>
    </body>
    </html>
解釋程式碼
這段程式碼是一個 ASP.NET MVC 視圖,用於顯示一個水費記錄的列表。以下是對這段程式碼的詳細解釋:
@model IEnumerable<WebApplication5.Models.WATER_BILL>
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}
@model 定義了這個視圖的模型類型,它是 IEnumerable<WATER_BILL>,也就是一個 WATER_BILL 模型的集合,代表多個水費記錄。Layout 指定了此頁面使用的佈局頁面是 ~/Views/Shared/_Layout.cshtml。@{
    ViewBag.Title = "WaterList";
}
ViewBag.Title 用來設定頁面的標題,這裡設置為 "WaterList"。<h2>作品-水費</h2>
<h3>依照水費內容</h3>
<style>
    .align-right {
        text-align: right;
    }
</style>
.align-right 是一個 CSS 類,用來將某些表格內容靠右對齊。<p>
    @Html.ActionLink("水費:新增", "WaterCreate", null, new { @class = "btn btn-danger" })
</p>
<form method="get" action="@Url.Action("WaterList", "Home")">
    <label for="startDate">開始日期:</label>
    <input type="date" name="startDate">
    <label for="endDate">結束日期:</label>
    <input type="date" name="endDate">
    <button type="submit">搜索</button>
</form>
Html.ActionLink 生成一個按鈕,當點擊後會導向 WaterCreate 動作,用於新增水費資料。<form> 創建了一個搜尋表單,允許用戶根據水費的開始和結束日期進行篩選。表單使用 GET 請求提交至 WaterList 動作。@using (Html.BeginForm())
{
    <label>廠區:</label>
    @Html.DropDownList("factory", new List<SelectListItem>
    {
        new SelectListItem { Value = "永康廠", Text = "永康廠/水號:12-34567890-1" },
        new SelectListItem { Value = "永科廠", Text = "永科廠/水號:23-45678901-2" }
    })
    <input type="submit" value="搜索" />
}
Html.DropDownList 生成一個下拉列表,供用戶選擇廠區篩選條件。這裡有兩個廠區:永康廠和永科廠。<table class="table" style="margin-top: 20px;">
    <thead>
        <tr>
            <th>@Html.DisplayNameFor(model => model.DOCUMENT_ID)</th>
            <!-- 其他表頭... -->
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>@Html.DisplayFor(modelItem => item.DOCUMENT_ID)</td>
                <td>@Html.DisplayFor(modelItem => item.FormattedFROM_BILLING_PERIOD)</td>
                <td>@Html.DisplayFor(modelItem => item.FormattedUNTIL_BILLING_PERIOD)</td>
                <!-- 其他資料欄位... -->
                <td>
                    @if (item.PDF_CONTENT != null && item.PDF_CONTENT.Length > 0)
                    {
                        <a href="@Url.Action("GetPdfFile", "Home", new { id = item.DOCUMENT_ID })" target="_blank">檢視 PDF 檔案</a>
                    }
                    else
                    {
                        <span>沒有上傳 PDF 檔案</span>
                    }
                </td>
                <td>@Html.ActionLink("修改", "WaterEdit", new { id = item.DOCUMENT_ID })</td>
            </tr>
        }
    </tbody>
</table>
@foreach 循環來遍歷模型集合中的每個水費記錄。DOCUMENT_ID, FROM_BILLING_PERIOD, UNTIL_BILLING_PERIOD 等。FormattedFROM_BILLING_PERIOD 和 FormattedUNTIL_BILLING_PERIOD 是經過格式化的日期顯示方式。@Html.DisplayFor(modelItem => item.FormattedNUMBER_POINTERS)
@Html.DisplayFor(modelItem => item.FormattedTOTAL_WATER)
@Html.DisplayFor(modelItem => item.FormattedTOTAL_BILL_TAX)
@Html.DisplayFor(modelItem => item.FormattedCARBON_PERIOD)
Formatted 前綴,表示它們經過了格式化處理,可能是數字的格式化或單位的處理等。這段程式碼結束於 </tbody> 和 </table>,結束了表格的定義。
總結來說,這是一個顯示水費資料的網頁,允許用戶篩選、檢視、修改資料,並上傳或檢視 PDF 檔案。
大家明天見~